package com.hzw.saas.api.user;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hzw.saas.api.user.bo.CustomerBO;
import com.hzw.saas.api.user.export.UserRegisterBO;
import com.hzw.saas.api.user.query.*;
import com.hzw.saas.common.config.util.PageParam;
import com.hzw.saas.common.util.enums.AssertEnum;
import com.hzw.saas.common.util.enums.SortEnum;

import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * @author zzl
 * @since 04/03/2021
 */
public interface ICustomerService {


    /**
     * 根据客户属性检查客户信息是否存在
     *
     * @param query 客户唯一性属性，多字段查询逻辑运算符为 or
     * @return true or false
     */
    boolean existCustomer(CustomerGetQuery query, AssertEnum throwOnEnum);

    /**
     * @param pid
     * @return
     */
    CustomerBO getCustomerById(String pid);

    /**
     * @param pid
     * @return
     */
    CustomerBO getCustomerDetailById(String pid);

    /**
     * 获取客户信息
     *
     * @param userId 用户id
     * @return 客户信息
     */
    CustomerBO getCustomerByUserId(String userId);

    /**
     * 获取客户信息
     *
     * @param customerNo 客户编号
     * @return 客户信息
     */
    CustomerBO getCustomerByNo(String customerNo);

    /**
     * 获取客户信息
     *
     * @param query 客户唯一性属性，多字段查询逻辑运算符为 and
     * @return 客户信息
     */
    CustomerBO getCustomer(CustomerGetQuery query);

    /**
     * 分页获取客户信息
     *
     * @param pageParam 分页
     * @return 客户信息分页列表
     */
    IPage<CustomerBO> pageCustomers(PageParam pageParam);

    /**
     * 分页获取客户信息，支持模糊查询
     *
     * @param pageParam   分页信息
     * @param fuzzyString 模糊查询内容，为空则返回所有
     * @param levelIds 客户登记Id
     * @param isOpen 是否开通云账号
     * @param channelIds 渠道描述
     * @param userIds
     * @return 模糊查询客户信息分页结果
     */
    IPage<CustomerBO> pageCustomers(PageParam pageParam, String fuzzyString, List<String> levelIds, Boolean isOpen, List<String> channelTypes, List<String> userIds,List<String> channelIds);



    IPage<CustomerBO> efficientPageCustomers(PageParam pageParam);

    /**
     * 模糊查询，获取对应的用户ID
     *
     * @param fuzzyString 可以为空
     * @return
     */
    List<String> listCustomer2UserId(String fuzzyString);

    List<CustomerBO> listCustomerByEmails(Collection<String> emails);

    /**
     * 模糊查询，获取对应的用户ID
     *
     * @param fuzzyString 可以为空
     * @param levelIds 可以为null
     * @param startTime 可以为null
     * @param endTime 可以为null
     * @param isOpen 可以为null
     * @param sortEnum 可以为null
     * @return
     */
    List<String> listCustomer2UserId(String fuzzyString, List<String> levelIds, Date startTime, Date endTime, Boolean isOpen, SortEnum sortEnum);

    /**
     * 登记客户信息
     * 含客户等级等信息的生成
     *
     * @param customer2Add 客户信息
     * @param rights2Add 自定义的用户权益，若不需要自定义，传null
     * @return 客户信息，包含生成的客户ID
     */
    CustomerBO registerCustomer(CustomerAddQuery customer2Add, UserRightsProp rights2Add);

    /**
     * 通过客户编号，创建云平台账户
     *
     * @param userAccount2Add
     * @return
     */
    CustomerBO createSaasUser(String customerNo, UserAccountAddQuery userAccount2Add);

    /**
     * 更新客户信息
     *
     * @param customer2Update 客户信息
     */
    boolean updateCustomer(CustomerUpdateQuery customer2Update, UserRightsProp rights2Update);

    /**
     * 删除客户信息
     *
     * @param customerNo
     * @return
     */
    void deleteCustomerByNo(String customerNo);

    /**
     *
     * @param userId
     */
    void deleteCustomerByUserId(String userId);

    /**
     * 获取未分配HPC帐号的客户列表
     *
     * @param pageParam
     * @return
     */
    IPage<CustomerBO> listUnBoundCustomerList(PageParam pageParam);

    /**
     * 获取channelId对应的数量
     * @param channelIds
     * @return
     */
    Integer countByChannelId(List<String> channelIds);

    /**
     * @param userIds
     * @return
     */
    List<CustomerBO> getCustomersByUser(List<String> userIds);

    /**
     * 分页获取客户信息，指定 not in 用户范围 AND 模糊查询，
     * @param pageParam
     * @param userIds
     * @param fuzzy
     * @return
     */
    IPage<CustomerBO> listCustomerByNotInUserIdAndFuzzy(PageParam pageParam, List<String> userIds, String fuzzy, String keyword);

    /**
     * 分页获取客户信息，指定 in 用户范围 AND 模糊查询，
     * @param pageParam
     * @param userIds
     * @param fuzzy
     * @return
     */
    IPage<CustomerBO> listCustomerByInUserIdAndFuzzy(PageParam pageParam, List<String> userIds, String fuzzy, String keyword);

    /**
     * 获取试用合同客户列表（未绑定过HPC的客户列表）
     * @param pageParam
     * @param fuzzy
     * @return
     */
    IPage<CustomerBO> listCustomerTrialList(PageParam pageParam, String fuzzy);

    List<UserRegisterBO> findByUserIds(List<String> userIds);

    int getCustomerHpcCount(String userId);
}
